#!/bin/bash

set -e

# 颜色定义
GREEN='\033[0;32m'
BLUE='\033[0;34m'
YELLOW='\033[0;33m'
RED='\033[0;31m'
NC='\033[0m'

LATEST_VERSION="v23.5.0"
MIN_MAJOR_VERSION=23

show_progress() {
    local text="$1"
    echo -ne "${BLUE}$text...${NC}"
    while kill -0 $! 2>/dev/null; do
        echo -ne "."
        sleep 0.5
    done
    echo -e " ${GREEN}✓${NC}"
}

detect_arch() {
    case "$(uname -m)" in
        x86_64) echo "x64" ;;
        aarch64|arm64) echo "arm64" ;;
        *) echo -e "${RED}错误: 不支持的架构 $(uname -m)${NC}"; exit 1 ;;
    esac
}

check_permission() {
    if [ ! -w "/usr/local/bin" ] && [ "$EUID" -ne 0 ]; then
        echo -e "${RED}错误: 需要管理员权限，请使用 sudo${NC}"
        exit 1
    fi
}

get_major_version() {
    local version="$1"
    echo "$version" | sed 's/^v//' | cut -d'.' -f1
}

check_nodejs_version() {
    if command -v node &>/dev/null; then
        local current_version=$(node -v)
        local current_major=$(get_major_version "$current_version")
        
        echo -e "${BLUE}检测到已安装Node.js $current_version${NC}"
        
        if [ "$current_major" -ge "$MIN_MAJOR_VERSION" ]; then
            echo -e "${GREEN}✅ 当前版本已满足要求 (>= v$MIN_MAJOR_VERSION)，跳过安装${NC}"
            return 1  # 不需要安装
        else
            echo -e "${YELLOW}⚠️  当前版本过低 (< v$MIN_MAJOR_VERSION)，开始自动升级...${NC}"
            return 0  # 需要安装
        fi
    else
        echo -e "${BLUE}未检测到Node.js，开始全新安装...${NC}"
        return 0  # 需要安装
    fi
}

install_nodejs() {
    local arch=$(detect_arch)
    local url="https://nodejs.org/dist/$LATEST_VERSION/node-$LATEST_VERSION-linux-$arch.tar.xz"
    local temp_dir=$(mktemp -d)
    
    echo -e "${BLUE}开始安装Node.js $LATEST_VERSION ($arch)${NC}"
    
    (
        cd "$temp_dir"
        if command -v wget &>/dev/null; then
            wget -q --show-progress "$url"
        else
            curl -L -# "$url" -o "node-$LATEST_VERSION-linux-$arch.tar.xz"
        fi
    ) &
    show_progress "下载Node.js $LATEST_VERSION"
    
    (
        cd "$temp_dir"
        tar -xf "node-$LATEST_VERSION-linux-$arch.tar.xz"
        
        sudo mkdir -p /opt/node
        sudo rm -rf /opt/node/*
        sudo mv "node-$LATEST_VERSION-linux-$arch"/* /opt/node/
        
        sudo ln -sf /opt/node/bin/node /usr/local/bin/node
        sudo ln -sf /opt/node/bin/npm /usr/local/bin/npm
        sudo ln -sf /opt/node/bin/npx /usr/local/bin/npx
    ) &
    show_progress "安装Node.js"
    
    rm -rf "$temp_dir"
    
    if ! echo "$PATH" | grep -q "/opt/node/bin"; then
        echo 'export PATH=$PATH:/opt/node/bin' >> "$HOME/.bashrc"
        export PATH=$PATH:/opt/node/bin
    fi
}

# 配置npm和验证安装
setup_and_verify() {
    npm config set registry https://registry.npmmirror.com &
    show_progress "配置npm镜像"
    
    if command -v node &>/dev/null && command -v npm &>/dev/null; then
        local node_ver=$(node -v)
        local npm_ver=$(npm -v)
        echo -e "${GREEN}✅ 安装成功!${NC}"
        echo -e "${GREEN}   Node.js: $node_ver${NC}"
        echo -e "${GREEN}   npm: $npm_ver${NC}"
    else
        echo -e "${RED}❌ 安装失败${NC}"
        exit 1
    fi
}

# 主函数
main() {
    check_permission
    
    if check_nodejs_version; then
        install_nodejs
        setup_and_verify
        echo -e "${GREEN}🎉 安装完成! 可以开始使用 Node.js 23 了${NC}"
    else
        if command -v npm &>/dev/null; then
            npm config set registry https://registry.npmmirror.com &
        fi
        echo -e "${GREEN}🎉 Node.js 环境已就绪!${NC}"
    fi
}

main "$@"